/*
 * frame.h
 *	TODO: dodac w initach (plikach zew.) inicjalizacje tych struktur
 *  Created on: Apr 19, 2012
 *      Author: Rafal Sokolowski; Mirek Gorczakowski
 *      Comment: Plik od ramki tutaj jest definicja struktury do ramki ktora jest odbierana i wysylana. De facto dwie
 */

#ifndef FRAME_H_
#define FRAME_H_

#include "board.h"

struct SIncomingFrame{
	unsigned short u16_MsgIsFresh; // flaga nastawiana gdy wiadomosc po odbiorze zostala wpisana do msgRaw
	int           i32_MsgRaw; //tutaj znajduje sie cala ramka ktora przyjdzie - w stanie surowym
	unsigned char u8_Addr; // adres wiadomsci czyli dwa najstarsze bity z msgRaw
	unsigned char u8_Start; // 1 -- toggle start lub stop // 0 -- bez zmian (chasing led)
	unsigned char u8_Dir; // 3 -- toggle direction // 2 -- w prawo // 1 -- w lewo // 0 -- no change
	unsigned char u8_Speed; // 2 -- slower speed  // 1 -- faster speed // 0 -- no speed change
} g_oIncomingFrame;

struct SOutcomingFrame{
	unsigned short u16_MsgIsReadyToGo; // flaga nastawiana gdy wiadomosc jest scalona do atrybutu MSGRAW i gotowa do wysylki
	int           i32_MsgRaw; //tutaj znajduje sie cala ramka ktora przyjdzie - w stanie surowym
	unsigned char u8_Addr; // adres wiadomsci czyli dwa najstarsze bity z msgRaw
	unsigned char u8_Start; // 1 -- toggle start lub stop // 0 -- bez zmian (chasing led)
	unsigned char u8_Dir; // 3 -- toggle direction // 2 -- w prawo // 1 -- w lewo // 0 -- no change
	unsigned char u8_Speed; // 2 -- slower speed  // 1 -- faster speed // 0 -- no speed change
} g_oOutcomingFrame;

struct SLeds{

};

struct SFlags{
	unsigned char u8_MasterSlave; // 0 -- Slave // 1 -- Master - czyli w jakim trybie dziala program AKTUALNIE
	unsigned char u8_ActiveSlaves; // aktywne plytki slave, 0 bit Slave0, 1 bit Slave1, 2 bit Slave2 // tj, 1 + 2 + 4 oznacza aktywne wszystkie Slave'y // 1 + 2 oznacza aktywne Slave 0 i 1
	unsigned char u8_PushButton; // 1 - PB0 // 2 - PB1 // 4 - PB2; // TODO do ugadania czy ta linia sie nie powtarza z powyzsza (jej cel i funkcjonalnosc)
	unsigned char u8_JoyPush; // 1 - push;
	unsigned char u8_JoyRightLeft; // 1 - right // 0 left
	unsigned char u8_JoyUpDown; // 1 - up // 0 DOwn
	unsigned char u8_ButtonJoyInterrupt; // jezeli 1 to znaczy ze cos przyszlo do tej struktury
	unsigned char u8_TimerStart;  // TODO tutja jak jest 1 to znaczy zeby wystartowac timer
	unsigned char u8_TimerStop; // moze byc nadmiarowe do usuniecia (DEPRACTED??)
	unsigned char u8_3secondPassed; // flaga ze minely 3 sekundy. TODO: set this in Timer Int.
	unsigned char u8_3secondStarted; // Flaga ustawiana w przerwaniu w momencie wcisniecia przycisku (Wymaganie 1 do slave Master)
	unsigned char u8_LedPeriodPassed; // flaga do timera LED, zeby migaly z usluga w timerze.
	unsigned char u8_ServicePending; // flaga zbiorcza dla schedulera(Timer) ze, w ktorejs z funkcji przebil timer i trzeba wywolac funkcje (ta z tablicy wskaznikow funkcji)
}g_oFlags;

// UWAGA!
//UWAGA funkcja rozklada atrybuty MsgRaw - tylko wtedy kiedy jest zaznaczone isFresh!!!
void frameTranslate ( void ); // funkcja tlumaczaca i_32 MsgRaw na skladowe struktury w g_oOutcomingFrame g_oIncomingFrame
int changeSM ( void );
void frameSend (void); //wysylanie ramki
void frameRelay (void); //przekazywanie ramki dalej
void framePrepare (void); //przygotowanie ramki do wysylki (Master mode only)

int g_i32changeSM_timerID;


#endif /* FRAME_H_ */
